//#region URL编码
/**
 * URL编码
 * @param url 待编码的URL
 */
export function urlEncode(url) {
	return encodeURIComponent(url);
}
//#endregion
//#region URL解码
/**
 * URL解码
 * @param url 待解码的URL
 */
export function urlDecode(url) {
	return decodeURIComponent(url);
}
//#endregion
//#region Base64字符串解码
/**
 * Base64字符串解码
 * @param base64 待编码的字符串
 */
export function fromBase64(base64) {
	// return Buffer.from(base64, 'base64').toString();
	return window.atob(base64);
}
//#endregion
//#region Base64字符串编码
/**
 * Base64字符串编码
 * @param str 待解码的Base64字符串
 */
export function toBase64(str) {
	// return Buffer.from(str).toString('base64');
	return window.btoa(str);
}
//#endregion

//#region 获取URL中Hash串中的查询参数值
/**
 * 获取URL中Hash串中的查询参数值
 * @param url URL字符串
 * @param name 参数名
 */
export function getHashURLSearchParams(url, name) {
	if (url.indexOf('#') >= 0) {
		url = subStr(url, '#');
	}
	if (url.indexOf('?') >= 0) {
		url = subStr(url, '?');
	}
	const params = new URLSearchParams(url);
	return params.get(name);
}
//#endregion
//#region 提供首尾字符串截取中间的字符串
/**
 * 提供首尾字符串截取中间的字符串
 * @param str 待截取的字符串
 * @param start 起始的字符串
 * @param end 结束的字符串
 */
export function subStr(
	str,
	start = null,
	end = null,
) {
	let startIndex = 0;
	let endIndex = str.length;
	if (start) {
		startIndex = str.indexOf(start) + start.length;
	}
	if (end) {
		endIndex = str.indexOf(end);
	}
	// return str.substr(startIndex, endIndex - startIndex);
	return str.substring(startIndex, endIndex);
}
//#endregion
//#region 从集合中删除符合条件的项
/**
 * 从集合中删除符合条件的项
 * @param items 集合
 * @param exp 删除项查询表达式
 */
export function remove(items, exp) {
	let index = items.findIndex(exp);
	if (index > -1) {
		items.splice(index, 1);
	}
	index = items.findIndex(exp);
	if (index > -1) {
		remove(items, exp);
	}
	return items;
}
//#endregion
//#region 值转文字
/**
 * 值转文字
 * @param id 待转换的值
 * @param array 数据节点集合
 * @param defaultText 转换失败时的默认文字
 */
export function valueToText(
	id,
	array,
	defaultText = null,
) {
	let text = defaultText == null ? id.toString() : defaultText;
	array.forEach((item) => {
		if (item.id === id) {
			text = item.text;
			return false;
		}
		return true;
	});
	return text;
}
//#endregion
//#region 展开集合拼接字符串
/**
 * 展开集合拼接字符串
 * @param array 待展开的集合
 * @param separator 分隔符
 */
export function expandAndToString(array, separator = ',') {
	let result = '';
	if (!array || !array.length) {
		return result;
	}
	array.forEach((item) => {
		result = result + item.toString() + separator;
	});
	// return result.substr(0, result.length - separator.length);
	return result.substring(0, result.length);
}
//#endregion
//#region 下载数据
/**
 * 下载数据
 * @param filename 存储的文件名
 * @param content 下载得到的内容
 */
export function download(filename, content) {
	const blob = new Blob([content]);
	const urlLink = window.URL.createObjectURL(blob);

	const saveLink = document.createElement('a');
	saveLink.style.display = 'none';
	saveLink.href = urlLink;
	saveLink.setAttribute('download', filename); //指定下载后的文件名，防跳转
	document.body.appendChild(saveLink);
	saveLink.click();

	//释放内存
	window.URL.revokeObjectURL(saveLink.href);
}
//#endregion

//#region 打开Email的网站
/**
 * 打开Email的网站
 * @param email Email地址
 */
export function openMailSite(email) {
	const host = subStr(email, '@');
	const url = `http://mail.${host}`;
	window.open(url);
}
//#endregion

//#region 获取文件的Base64格式
/**
 * 获取文件的Base64格式
 * @param file 文件的信息
 * @param callback 转换成Base64后的回调
 */
export function getBase64(file, callback) {
	const reader = new FileReader();
	reader.addEventListener('load', () => callback(reader.result));
	reader.readAsDataURL(file);
}
//#endregion
//#region 获取文件的Base64格式
/**
 * 获取文件的Base64格式
 * @param file 文件的信息
 */
export function getBase64WithFile(file) {
	return new Promise((resolve, reject) => {
		const reader = new FileReader();
		reader.readAsDataURL(file);
		reader.onload = () => resolve(reader.result);
		reader.onerror = (error) => reject(error);
	});
}
//#endregion

//#region 获取Base64格式的文件对象
/**
 * 获取Base64格式的文件对象
 * @param base64Data Base64数据
 * @param fileName 文件名称
 */
export function getFileWithBase64(base64Data, fileName) {
	const arr = base64Data.split(',');
	if (arr && arr[0] && arr[1]) {
		const arr0match = arr[0].match(/:(.*?);/);
		let mime = '';
		if (arr0match) {
			mime = arr0match[1];
		}
		// const bytes = atob(arr[1]); // 解码base64
		const bytes = Buffer.from(arr[1], 'base64').toString(); // 解码base64
		let n = bytes.length;
		const ia = new Uint8Array(n);
		while (n--) {
			ia[n] = bytes.charCodeAt(n);
		}
		return new File([ia], fileName, {
			type: mime
		});
	}
	return null;
}
//#endregion
